/*
 * Copyright (C), 2016, SOFT
 * FileName:  
 * Author:  
 * Date:  
 * History:  
 * <author>    <time>      <version>   <desc> 
 * 修改人姓名            修改时间               版本号                  描述
 */
package com.solution.common.utils;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 构造 easyui 的tree、treegrid 所需要的json格式对象
 * @author solin 2017-2-14 上午9:16:48  
 */

public class TreeUtil implements Serializable {
     
    private static final long serialVersionUID = 1L;
    
    /** 
     *提供json必要的几个必要的属性
     */
    private String id ; //当前节点编号
    /** 
     *父节点编号
     */
    private String pid ; 
    /** 
     *节点描述：
     */
    private String text ; 
    /** 
     *easyui节点样式
     */
    private String iconCls ;//
    /** 
     * state：节点状态，'open' 或 'closed'，默认是 'open'。当设置为 'closed' 时，该节点有子节点，并且将从远程站点加载它们。
     */
    private String state ;//
    /** 
     * 定义了一些子节点的节点数组。
     */
    private String checked ;
    /** 
     *给一个节点添加的自定义属性。
     */
    private Map<String,String> attributes;
    /** 
     *子节点信息
     */
    private List<TreeUtil> children = new ArrayList<TreeUtil>() ;
    
    /** 
     *当前节点信息
     */
    private Object currentNode;
    
    /**
	 * 默认构造器
	 *
	 */
	public TreeUtil() {
		super();
	}
	/**
	 * 初始化方法构造器
	 *
	 * @param id
	 * @param pid
	 * @param text
	 * @param currentNode
	 */
	public TreeUtil(String id, String pid, String text, Object currentNode) {
		super();
		this.id = id;
		this.pid = pid;
		this.text = text;
		this.currentNode = currentNode;
	}


	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getPid() {
		return pid;
	}

	public void setPid(String pid) {
		this.pid = pid;
	}

	public String getText() {
		return text;
	}

	public void setText(String text) {
		this.text = text;
	}

	public String getIconCls() {
		return iconCls;
	}

	public void setIconCls(String iconCls) {
		this.iconCls = iconCls;
	}

	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}

	public String getChecked() {
		return checked;
	}

	public void setChecked(String checked) {
		this.checked = checked;
	}

	public List<TreeUtil> getChildren() {
		return children;
	}

	public void setChildren(List<TreeUtil> children) {
		this.children = children;
	}

    public Map<String, String> getAttributes() {
		return attributes;
	}

	public void setAttributes(Map<String, String> attributes) {
		this.attributes = attributes;
	}

	/**
	 * @return the currentNode
	 */
	public Object getCurrentNode() {
		return currentNode;
	}

	/**
	 * @param currentNode the currentNode to set
	 */
	public void setCurrentNode(Object currentNode) {
		this.currentNode = currentNode;
	}

	/**
	 * 格式化为easyUI 所需的Tree json格式 
	 * @author solin 2017-2-14 上午9:37:36
	 * @param list TreeJson对象集合
	 * @return 
	 */
	public static List<TreeUtil> formatTree(List<TreeUtil> list) {
		TreeUtil root = new TreeUtil();
		List<TreeUtil> treelist = new ArrayList<TreeUtil>();// 拼凑好的json格式的数据
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				// 如果该节点没有父节点那么它就是根（root）节点
				if ("".equals(list.get(i).getPid())) {
					root = list.get(i);
					// 获取该根节点的子节点
					getChildrenNodes(list, root);
					treelist.add(root);
				}
			}
		}
		return treelist;
	}
	
	/**
	 * 格式化为easyUI 所需的Tree json格式 
	 * 自定义根节点
	 * @author solin 2017-2-14 上午9:53:43
	 * @param list
	 * @param pid 根节点
	 * @return 
	 */
	public static List<TreeUtil> formatTree(List<TreeUtil> list, String pid) {
		TreeUtil root = new TreeUtil();
		List<TreeUtil> treelist = new ArrayList<TreeUtil>();// 拼凑好的json格式的数据
		if (list != null && list.size() > 0) {
			for (int i = 0; i < list.size(); i++) {
				// 如果是根节点
				if (pid.equals(list.get(i).getPid())) {
					root = list.get(i);
					// 获取该根节点的子节点
					getChildrenNodes(list, root);
					treelist.add(root);
				}
			}
		}
		return treelist;
	}
	  
	/**
	 * 获取指定节点的子节点
	 * @author solin 2017-2-14 上午9:55:32
	 * @param nodes
	 * @param root 
	 */
	private static void getChildrenNodes(List<TreeUtil> nodes, TreeUtil root) {
		for (TreeUtil treeJson : nodes) {
			// 在根节点中下寻找它的子节点
			if (treeJson.getPid().equals(root.getId())) {// 如果找到root的子结点
				// 在父节点下添加子节点
				root.getChildren().add(treeJson);
				// 寻找子节点的子节点
				getChildrenNodes(nodes, treeJson);
			}
		}
	}
	/**
	 * @return
	 * @exception/throws [异常类型][异常说明]
	 * @author shanchuangye
	 * @date 2017年4月15日 下午2:31:51
	 * @modify <scy> <2017年4月15日 下午2:31:51>
	 */
	@Override
	public String toString() {
		return "TreeUtil [id=" + id + ", pid=" + pid + ", text=" + text
				+ ", iconCls=" + iconCls + ", state=" + state + ", checked="
				+ checked + ", attributes=" + attributes + ", children="
				+ children + ", currentNode=" + currentNode + "]";
	}
}